def NoTerminalesRepetidos():
    archivo_entrada = open("Gramatica.py", "r")
    noTerminales = set()
    repetidos = set()
    while True:
        linea = archivo_entrada.readline()
        if not linea: break
        if linea.find(':') > 0:
            if linea[0:linea.find(':')].strip() not in noTerminales:
                noTerminales.add(linea[0:linea.find(':')].strip())
            else:
                repetidos.add(linea[0:linea.find(':')].strip())

    if len(repetidos)>0:
        print "No terminales repetidos:"
        for a in repetidos:
            print a
    else:
        print "No hay no terminales repetidos"

def ExpresionesRepetidas():
    archivo_entrada = open("Gramatica.py", "r")
    reglas = {}
    reglas_repetidas = {}
    noTerminal = ""
    while True:
        linea = archivo_entrada.readline()
        if not linea: break
        if linea.find(':') > 0:
            noTerminal = linea[0:linea.find(':')].strip()
            if linea.find("#")>0:
                reglas[noTerminal] = [linea[linea.find('=')+1:linea.find("#")].strip()]
            else:
                reglas[noTerminal] = [linea[linea.find('=')+1:].strip()]
        else:
            if linea.find("|")>=0:
                if linea.find("#")>0:
                    reglas[noTerminal].append(linea[linea.find('|')+1:linea.find("#")].strip())
                else:
                    reglas[noTerminal].append(linea[linea.find('|')+1:].strip())

##    for r in reglas:
##        print r, reglas[r]

    # Buscar expresiones repetidas
    for r1 in reglas:
        _r1 = set(reglas[r1])
        for r2 in reglas:
            _r2 = set(reglas[r2])
            if _r1 == _r2 and r1 <> r2:
                if r1 not in reglas_repetidas:
                    reglas_repetidas[r1] = [r2]
                else:
                    reglas_repetidas[r1].append(r2)

    if len(reglas_repetidas)>0:
        print "Expresiones repetidas:"
        for rp in reglas_repetidas:
            print rp, reglas_repetidas[rp]
    else:
        print "No hay no expresiones repetidas"

def main():
    NoTerminalesRepetidos()
    ExpresionesRepetidas()

if __name__ == '__main__':
    main()